Stack = require("./stack.js");
/**
 * -- 返回栈里最小的元素，且时间复杂度为o(1)
 *
 * @author lmay.Zhou
 * @since 2019/4/9 22:17 星期二
 * @qq 379839355
 * @email lmay@lmaye.com
 */
function minStack() {
    // 常规栈
    let dataStack = new Stack.Stack();
    // 最小元素的栈
    let minStack = new Stack.Stack();

    /**
     * 向栈里压入一个元素
     *
     * @param item  元素
     */
    this.push = function(item) {
        // 常规栈压入元素
        dataStack.push(item);
        // 如果min stack为空直接放入，或者item小于min stack栈顶元素，压入元素；这样做是为了保证min stack的栈顶始终保存栈的最小值
        if(minStack.isEmpty() || item < minStack.top()) {
            minStack.push(item);
        } else {
            // 否则item大于等于min stack的栈顶元素，把min stack的栈顶元素再放入一次；min stack的元素个数要和data stack保持一致
            minStack.push(minStack.top());
        }
    };

    /**
     * 两个栈顶都弹出
     */
    this.pop = function() {
        dataStack.pop();
        minStack.pop();
    };

    /**
     * 返回栈里最小的元素
     *
     * @returns {*}
     */
    this.min = function() {
        return minStack.top();
    };
}

minStack = new minStack();
minStack.push(3);
minStack.push(6);
minStack.push(8);
console.log(minStack.min());
minStack.push(2);
console.log(minStack.min());